package com.own.business.system.user.business.service.impl;

import com.own.business.system.account.business.service.SystemAccountService;
import com.own.business.system.account.common.core.AccountSpringHook;
import com.own.business.system.user.business.service.SystemRegisterService;
import com.own.business.system.user.business.util.CreateUserUtil;
import com.own.business.system.user.common.constant.ConstantSystemUser;
import com.own.business.system.user.common.em.RegisterExceptionEnum;
import com.own.business.system.user.common.exception.RegisterUserException;
import com.own.business.system.user.entity.po.SystemUser;
import com.own.business.system.user.entity.vo.SystemUserVo;
import com.own.business.system.user.mapper.SystemUserMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.function.Supplier;

/**
 * SystemRegisterServiceImpl
 *
 * @author chenxueli
 * @date 2021-09-02 20:21:00
 */
@Slf4j
@Service
public class SystemRegisterServiceImpl implements SystemRegisterService {

    @Resource
    private SystemUserMapper systemUserMapper;

    @Resource
    private SystemAccountService systemAccountService;

    @Resource
    private AccountSpringHook accountSpringHook;

    @Resource
    private CreateUserUtil createUserUtil;

    /**
     * 注册账号
     *
     * @param username    用户名
     * @param password    密码（明文）
     * @param type        类型
     * @param accountType 账号类型 1=普通用户 2=管理员
     * @return 用户信息
     */
    @Override
    public SystemUserVo register(String username, String password, String type, int accountType) {
        return register(
                () -> createUserUtil.createUser(temp -> {
                    temp.setFromType(ConstantSystemUser.FromType.PERSONAL);
                    temp.setType(accountType);
                }),
                username,
                password,
                type,
                accountType
        );
    }

    /**
     * 注册账号
     *
     * @param userId      用户id
     * @param username    用户名
     * @param password    密码（明文）
     * @param type        类型
     * @param accountType 账号类型 1=普通用户 2=管理员
     * @return 用户信息
     */
    @Override
    public SystemUserVo register(Long userId, String username, String password, String type, int accountType) {
        return register(
                () -> systemUserMapper.selectById(userId),
                username,
                password,
                type,
                accountType
        );
    }

    /**
     * 注册账号
     *
     * @param function    获取用户信息的函数
     * @param username    用户名
     * @param password    密码（明文）
     * @param type        类型
     * @param accountType 账号类型 1=普通用户 2=管理员
     * @return 用户信息
     */
    @Override
    public SystemUserVo register(Supplier<SystemUser> function, String username, String password, String type, int accountType) {
        // 获取对应的处理器信息
        var handler = accountSpringHook.get(type);
        // 去查询对应的账号信息是否被注册
        var account = systemAccountService.get(username, handler.type(), accountType);
        if (account != null) {
            throw new RegisterUserException(RegisterExceptionEnum.ACCOUNT_EXIST);
        }
        // 创建一个新的用户
        var user = function.get();
        // 执行对应的账号注册逻辑
        handler.add(username, user.getId(), accountType, password);
        // 返回用户信息
        return new SystemUserVo(user);
    }
}
